package appModels

import (
	"time"
	"xorm.io/xorm"
)

type IModel interface {
	AddValid() error                                                                //添加数据校验
	EditValid() error                                                               //修改数据校验
	Model() interface{}                                                             //获取模型
	Slice() interface{}                                                             //获取模型切片
	Init(db *xorm.Session, guid string, loginUser *UserInfo) error          //初始化部分数据
	AddWhere(db *xorm.Session, loginUser *UserInfo) error                   //添加之前调用，判断是否可添加，设置添加条件等
	DeleteWhere(db *xorm.Session, loginUser *UserInfo, conditions ...string) error //删除之前调用，判断是否可删除，设置删除条件等
	EditWhere(db *xorm.Session, loginUser *UserInfo) error                  //修改之前调用，判断是否可修改，设置修改条件
	GetWhere(db *xorm.Session, loginUser *UserInfo, condition string) error        //查询一条数据条件
	ListWhere(db *xorm.Session, loginUser *UserInfo) error                  //查询列表条件、查询分页数据条数条件
	PaginateWhere(db *xorm.Session, loginUser *UserInfo) error              //查询分页时条件
}

// 所有模型[公有字段]
type Models struct {
	Id  string `json:"id" xorm:"varchar(128) pk notnull unique"`           //id guid
	Bid string `json:"bid" xorm:"varchar(128) notnull index default('0')"` //所属单位ID branch表的ID
}

// 模型[所属用户]字段 如果权限要控制到用户的模型 可继承
type MUser struct {
	UserId    string `json:"user_id" xorm:"varchar(128)"`    // 所属用户
	AccountId string `json:"account_id" xorm:"varchar(128)"` //用户所属账号ID
}

// 模型[创建时间][更新时间]等字段,orm会自动设置值
type MTime struct {
	Created time.Time `json:"created" xorm:"datetime created"` //创建时间
	Updated time.Time `json:"updated" xorm:"datetime updated"` //更新时间
}

// 模型[创建时间]字段,orm会自动设置值
type MCreated struct {
	Created time.Time `json:"created" xorm:"datetime created"` //创建时间
}

// 模型[更新时间]字段,orm会自动设置值
type MUpdated struct {
	Updated time.Time `json:"updated" xorm:"datetime updated"` //更新时间
}

// 模型[乐观锁]字段 由orm维护，继承该模型的模型更新删除时必须存在version字段数据
type MVersion struct {
	Version int `json:"version" xorm:"version"` //乐观锁
}

// [软删除]字段，由orm维护
type MDelete struct {
	Delete time.Time `json:"version" xorm:"datetime delete"` //软删除
}
